<?php

namespace App\Http\Controllers\Import;

use App\Http\Controllers\Admin\CommonController;
use App\Http\Controllers\Controller;
use App\Models\BookRecom;
use App\Models\ResourceLeer;
use App\Models\ResourceTypeExternal;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use stdClass;

/**
 * excel导入功能
 * 乐儿数据导入
 */
class LeerDataImport extends Controller
{
    public $model = null;
    public $request = null;
    public $commonObj = null;

    public function __construct(Request $request)
    {
        $this->request = $request;
        $this->model = new ResourceLeer();
        $this->commonObj = new CommonController();
    }

    /**
     * 乐儿数据管理导入
     * @param file  excel 文件名
   //  * @param is_update  每次导入 只会更新新的数据（已有数据不做处理），不更改之前的数据，若要更改，只能手动更改，
     */
    public function index()
    {
        DB::beginTransaction();
        try {
            $data = $this->getData('file', 'book_import');
            //判断模版是否有误
            $template_error = $this->checkTemplate($data[0]);
            if ($template_error !== true) {
                return $this->commonObj->returnApi(202, '模版有误请重新上传');
            }

            $resourceTypeExternalModel = new ResourceTypeExternal();

            // $success = 0;//成功个数
            $error = 0; //失败个数
            $error_msg = ''; //失败原因
            foreach ($data as $key => $val) {
                if ($key === 0) continue; //第一行是标题

                $serial = $val[0];
                $type_name = $val[1];
                $title = $val[2];
                $link = $val[3];
                $img = $val[4];

                //获取文件后缀名
                $postfix = explode('.', $link);
                $postfix = $postfix[count($postfix) - 1];
                if (!in_array($postfix, ['mp4', 'html'])) {
                    $error++;
                    $error_msg .= '[ID：“' . $serial . '”后缀名不符合要求' . $postfix . ']';
                    continue;
                }

                if (empty($type_name)) {
                    $error++;
                    $error_msg .= '[ID：“' . $serial . '”类型名称不能为空]';
                    continue;
                }
                if (empty($title)) {
                    $error++;
                    $error_msg .= '[ID：“' . $serial . '”作品名称不能为空]';
                    continue;
                }
                if (empty($link)) {
                    $error++;
                    $error_msg .= '[ID：“' . $serial . '”作品链接不能为空]';
                    continue;
                }
                if (empty($img)) {
                    $error++;
                    $error_msg .= '[ID：“' . $serial . '”作品封面不能为空]';
                    continue;
                }

                $type_id = $resourceTypeExternalModel->getTypeNameNoAdd([
                    'name' => $type_name,
                    'big_type_id' => 3,
                    'resource_business_id' => 5
                ]);

                $data = [];
                $data['type_id'] = $type_id;
                $data['title'] = $title;
                $data['link'] = $link;
                $data['img'] = $img;
                $data['big_type_id'] = 3;
                $data['postfix'] = strtolower($postfix);
                $data['data_unique_id'] = md5($type_id . '-' . $title . '-' . $link);
                $this->model->addData($data); //覆盖更新数据
            }

            DB::commit();
            $return_msg = "导入成功，" . '错误: ' . $error . ' 个';
            if ($error) $return_msg .= '错误原因:' . $error_msg;

            return $this->commonObj->returnApi(200, $return_msg, true);
        } catch (\Exception $e) {
            DB::rollBack();
            return $this->commonObj->returnApi(202, $e->getMessage());
        }
    }


    /**
     * 处理数据
     * @param $file_name  上传文件名
     * @param $file_dir  存放文件夹
     */
    public function getData($file_name = 'file', $file_dir = 'file')
    {
        set_time_limit(500);
        ini_set('memory_limit', '500M');

        if ($this->request->file($file_name) == null) throw new Exception('请添加Excel表格......'); // return $this->returnApi(202, '请添加Excel表格......');

        //接收前台文件
        if (empty($_FILES[$file_name]['name'])) throw new Exception('上传文件不能为空'); //return $this->returnApi(202, "上传文件不能为空");
        if (empty($_FILES[$file_name]['size']) || $_FILES[$file_name]['size'] > 5242880) throw new Exception('上传文件不能大于5M'); //return $this->returnApi(202, "上传文件不能大于5M");

        //判断文件名
        $name = explode('.', $_FILES[$file_name]['name'])[1];
        if ($name !== 'xls' && $name !== 'xlsx') throw new Exception('上传文件后缀名不允许，只能上传 .xls 或 .xlsx 的文件'); //return $this->returnApi(202, "上传文件后缀名不允许，只能上传 .xls 或 .xlsx 的文件");

        // 这个方法是 自定义文件名 文件上传方法 。 将获取到的Excel文件 保存到/public/upload/book_import/ 文件中。
        $foldername =  $file_dir . '/' . date('Y-m-d'); //$file_name.'/'.date('Y-m-d')  存放路径，按日志存储
        $file = $this->request->file($file_name)->store($foldername);

        if ($file) {
            //$this->request->file($file_name)->getRealPath(); 获取临时文件地址
            $file_addr = public_path('uploads') . '/' . $file; //完整地址
            /*  Excel::load($file_addr, function ($reader) {return $reader->all();}); */
            // $delTitle = 1; //指定头行数  删除它   如果需要删除 就填1
            $delTitle = 0; //不删除数据，做模版判断
            $excel = new Import($delTitle);
            Excel::import($excel, $file_addr);
            if ($excel->data) {
                return $excel->data->toArray(); //获取所有的数据（数组）
            }
            throw new Exception('导入失败');
        }
        throw new Exception('请添加Excel表格......'); //return $this->returnApi(202, "导入失败");
    }

    /**
     * 检查模版是否有误
     */
    public function checkTemplate($data)
    {
        if (
            $data[0] != '序号' ||
            $data[1] != '所属板块' ||
            $data[2] != '视频名称' ||
            $data[3] != '视频地址' ||
            $data[4] != '缩略图地址'
        ) {
            return false;
        }
        return true;
    }
}
